#!/bin/bash
# 彩票调度器管理脚本

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
SCHEDULER_SCRIPT="$SCRIPT_DIR/lottery_scheduler.py"
SERVICE_TEMPLATE="$SCRIPT_DIR/lottery-scheduler.service.template"
SERVICE_FILE="$SCRIPT_DIR/lottery-scheduler.service"
VENV_PATH="$SCRIPT_DIR/venv"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
彩票调度器管理脚本

用法: $0 <命令> [选项]

命令:
  generate    生成适用于当前系统的服务文件
  install     安装调度器服务
  start       启动调度器
  stop        停止调度器
  restart     重启调度器
  status      查看调度器状态
  logs        查看调度器日志
  schedule    查看任务计划
  manual      手动执行任务
  uninstall   卸载调度器服务

手动执行选项:
  --lottery   彩票类型 (fc3d, ssq, kl8, qlc, dlt, pl3, pl5, qxc)
  --action    操作类型 (fetch=获取开奖, update=更新奖项)

示例:
  $0 generate             # 生成服务文件
  $0 install              # 安装服务
  $0 start                # 启动调度器
  $0 status               # 查看状态
  $0 schedule             # 查看任务计划
  $0 manual --lottery ssq --action fetch  # 手动获取双色球开奖结果
  $0 manual --lottery dlt --action update # 手动更新大乐透奖项信息

EOF
}

# 检查虚拟环境
check_venv() {
    if [ ! -d "$VENV_PATH" ]; then
        log_error "虚拟环境不存在: $VENV_PATH"
        log_info "请先创建虚拟环境并安装依赖:"
        log_info "  python3 -m venv $VENV_PATH"
        log_info "  source $VENV_PATH/bin/activate"
        log_info "  pip install -r requirements.txt"
        exit 1
    fi
}

# 检查依赖
check_dependencies() {
    check_venv
    
    if ! "$VENV_PATH/bin/python" -c "import schedule, loguru" 2>/dev/null; then
        log_error "缺少必要的Python依赖"
        log_info "请安装依赖: pip install schedule loguru"
        exit 1
    fi
}

# 生成服务文件
generate_service_file() {
    log_info "生成适用于当前系统的服务文件..."
    
    if [ ! -f "$SERVICE_TEMPLATE" ]; then
        log_error "服务文件模板不存在: $SERVICE_TEMPLATE"
        exit 1
    fi
    
    # 检测当前用户和组
    if [ "$EUID" -eq 0 ]; then
        # 如果以root身份运行，使用root用户
        SERVICE_USER="root"
        SERVICE_GROUP="root"
    else
        # 使用当前用户
        SERVICE_USER="$(whoami)"
        SERVICE_GROUP="$(id -gn)"
    fi
    
    log_info "配置服务运行用户: $SERVICE_USER:$SERVICE_GROUP"
    log_info "项目目录: $PROJECT_DIR"
    log_info "虚拟环境: $VENV_PATH"
    
    # 替换模板中的占位符
    sed "s|{{USER}}|$SERVICE_USER|g; \
         s|{{GROUP}}|$SERVICE_GROUP|g; \
         s|{{PROJECT_DIR}}|$PROJECT_DIR|g; \
         s|{{SCRIPT_DIR}}|$SCRIPT_DIR|g; \
         s|{{VENV_PATH}}|$VENV_PATH|g" \
         "$SERVICE_TEMPLATE" > "$SERVICE_FILE"
    
    log_success "服务文件生成完成: $SERVICE_FILE"
}

# 安装服务
install_service() {
    log_info "安装彩票调度器服务..."
    
    check_dependencies
    
    # 生成适用于当前系统的服务文件
    generate_service_file
    
    # 创建日志目录
    mkdir -p "$PROJECT_DIR/logs"
    
    # 复制服务文件到systemd目录
    if [ -d "/lib/systemd/system/" ] || [ -d "/etc/systemd/system/" ]; then
        # Linux - 优先使用 /etc/systemd/system/ (CentOS 8)
        if [ -d "/etc/systemd/system/" ]; then
            SYSTEMD_DIR="/etc/systemd/system"
        else
            SYSTEMD_DIR="/lib/systemd/system"
        fi
        
        log_info "将服务文件复制到 $SYSTEMD_DIR/"
        sudo cp "$SERVICE_FILE" "$SYSTEMD_DIR/lottery-scheduler.service"
        sudo systemctl daemon-reload
        sudo systemctl enable lottery-scheduler
        log_success "服务安装完成"
        log_info "使用以下命令管理服务:"
        log_info "  sudo systemctl start lottery-scheduler"
        log_info "  sudo systemctl status lottery-scheduler"
    else
        # macOS 或其他系统，使用 launchd 或直接运行
        log_warning "检测到非Linux系统，将直接运行调度器"
        log_info "在macOS上，请使用 '$0 start' 启动调度器"
    fi
}

# 启动调度器
start_scheduler() {
    log_info "启动彩票调度器..."
    
    check_dependencies
    
    if command -v systemctl >/dev/null 2>&1; then
        # 使用systemd
        if systemctl is-active --quiet lottery-scheduler; then
            log_warning "调度器已在运行中"
            return 0
        fi
        
        sudo systemctl start lottery-scheduler
        log_success "调度器启动成功"
    else
        # 直接运行
        log_info "以后台模式启动调度器..."
        cd "$SCRIPT_DIR"
        # 激活虚拟环境并运行调度器
        nohup bash -c "source '$VENV_PATH/bin/activate' && python3 '$SCHEDULER_SCRIPT' --mode daemon" > "$PROJECT_DIR/logs/scheduler_nohup.log" 2>&1 &
        echo $! > "$PROJECT_DIR/logs/scheduler.pid"
        log_success "调度器启动成功 (PID: $!)"
        log_info "日志文件: $PROJECT_DIR/logs/scheduler_nohup.log"
    fi
}

# 停止调度器
stop_scheduler() {
    log_info "停止彩票调度器..."
    
    if command -v systemctl >/dev/null 2>&1; then
        # 使用systemd
        if ! systemctl is-active --quiet lottery-scheduler; then
            log_warning "调度器未在运行"
            return 0
        fi
        
        sudo systemctl stop lottery-scheduler
        log_success "调度器停止成功"
    else
        # 直接停止
        if [ -f "$PROJECT_DIR/logs/scheduler.pid" ]; then
            PID=$(cat "$PROJECT_DIR/logs/scheduler.pid")
            if kill -0 "$PID" 2>/dev/null; then
                kill -TERM "$PID"
                log_success "调度器停止成功 (PID: $PID)"
                rm -f "$PROJECT_DIR/logs/scheduler.pid"
            else
                log_warning "调度器进程不存在"
                rm -f "$PROJECT_DIR/logs/scheduler.pid"
            fi
        else
            log_warning "未找到调度器PID文件"
        fi
    fi
}

# 重启调度器
restart_scheduler() {
    log_info "重启彩票调度器..."
    stop_scheduler
    sleep 2
    start_scheduler
}

# 查看状态
show_status() {
    log_info "查看彩票调度器状态..."
    
    if command -v systemctl >/dev/null 2>&1; then
        # 使用systemd
        systemctl status lottery-scheduler
    else
        # 检查进程
        if [ -f "$PROJECT_DIR/logs/scheduler.pid" ]; then
            PID=$(cat "$PROJECT_DIR/logs/scheduler.pid")
            if kill -0 "$PID" 2>/dev/null; then
                log_success "调度器正在运行 (PID: $PID)"
                ps -p "$PID" -o pid,ppid,cmd
            else
                log_error "调度器进程不存在"
                rm -f "$PROJECT_DIR/logs/scheduler.pid"
            fi
        else
            log_warning "调度器未运行"
        fi
    fi
}

# 查看日志
show_logs() {
    log_info "查看彩票调度器日志..."
    
    if command -v systemctl >/dev/null 2>&1; then
        # 使用journalctl
        journalctl -u lottery-scheduler -f
    else
        # 查看日志文件
        if [ -f "$PROJECT_DIR/logs/lottery_scheduler.log" ]; then
            tail -f "$PROJECT_DIR/logs/lottery_scheduler.log"
        else
            log_warning "日志文件不存在"
        fi
    fi
}

# 查看任务计划
show_schedule() {
    log_info "查看彩票任务计划..."
    
    check_dependencies
    
    cd "$PROJECT_DIR"
    "$VENV_PATH/bin/python" "$SCHEDULER_SCRIPT" --mode status
}

# 手动执行任务
manual_task() {
    local lottery=""
    local action=""
    
    # 解析参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            --lottery)
                lottery="$2"
                shift 2
                ;;
            --action)
                action="$2"
                shift 2
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    if [ -z "$lottery" ] || [ -z "$action" ]; then
        log_error "手动执行需要指定 --lottery 和 --action 参数"
        show_help
        exit 1
    fi
    
    log_info "手动执行任务: $lottery - $action"
    
    check_dependencies
    
    cd "$PROJECT_DIR"
    "$VENV_PATH/bin/python" "$SCHEDULER_SCRIPT" --mode manual --lottery "$lottery" --action "$action"
}

# 卸载服务
uninstall_service() {
    log_info "卸载彩票调度器服务..."
    
    # 先停止服务
    stop_scheduler
    
    if command -v systemctl >/dev/null 2>&1; then
        # 使用systemd
        sudo systemctl disable lottery-scheduler 2>/dev/null || true
        # 删除服务文件 - 检查两个可能的位置
        sudo rm -f /etc/systemd/system/lottery-scheduler.service
        sudo rm -f /lib/systemd/system/lottery-scheduler.service
        sudo systemctl daemon-reload
        log_success "服务卸载完成"
    else
        # 清理PID文件
        rm -f "$PROJECT_DIR/logs/scheduler.pid"
        log_success "调度器清理完成"
    fi
}

# 主程序
main() {
    case "${1:-}" in
        generate)
            generate_service_file
            ;;
        install)
            install_service
            ;;
        start)
            start_scheduler
            ;;
        stop)
            stop_scheduler
            ;;
        restart)
            restart_scheduler
            ;;
        status)
            show_status
            ;;
        logs)
            show_logs
            ;;
        schedule)
            show_schedule
            ;;
        manual)
            shift
            manual_task "$@"
            ;;
        uninstall)
            uninstall_service
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: ${1:-}"
            echo
            show_help
            exit 1
            ;;
    esac
}

main "$@"
